from datetime import datetime
import re


def get_current_date_time_weekday():
    """
    获取当前日期、时间以及星期几。

    Returns:
        tuple: 包含以下信息的元组：
               - 日期 (str): 格式为 'YYYY-MM-DD'。
               - 时间 (str): 格式为 'HH:MM:SS'。
               - 星期 (str): 格式为中文星期几（例如 '星期一'）。
    """
    now = datetime.now()

    # 格式化日期和时间
    date_str = now.strftime('%Y-%m-%d')
    time_str = now.strftime('%H:%M:%S')

    # 获取星期几
    weekday_map = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
    weekday_str = weekday_map[now.weekday()]

    return date_str, time_str, weekday_str


def remove_extra_id(text: str) -> str:
    if not text:
        return text
    pattern = r'\[ID:.*?\]'
    return re.sub(pattern, '', text).strip()


class SentenceSplitter:
    """
    处理流式文本输出，根据标点符号或最大长度切分出完整的句子。
    """

    def __init__(self, max_buffer_length=100):
        # 缓冲区，用于存储未形成完整句子的文本
        self.buffer = ""
        # 句尾标点符号，包括中文和英文的常见句尾标记
        # 注意：这里我们排除了句中可能出现的分号
        # 使用正则表达式匹配，使得检测更灵活
        self.end_pattern = re.compile(r"([。？！，、]|[\.\?\!\,\.])")
        # 最大缓冲区长度，作为容错机制
        self.max_buffer_length = max_buffer_length

    def process_chunk(self, chunk: str) -> list[str]:
        """
        接收一个新的文本块，处理缓冲区，并返回所有切分出的完整句子。

        Args:
            chunk: 从大模型接收到的流式文本片段。

        Returns:
            一个包含所有完整句子的列表，这些句子可以发送给 TTS 引擎。
        """
        if not chunk:
            return []

        # 1. 将新的文本块追加到缓冲区
        self.buffer += chunk

        complete_sentences = []

        # 2. 循环检查缓冲区中是否包含完整的句子
        while True:
            # 使用 re.search 查找第一个句尾标点符号及其位置
            match = self.end_pattern.search(self.buffer)

            if match:
                # 找到完整的句子
                end_index = match.end()  # 标点符号的后一个位置

                # 切分出完整的句子（包括标点符号）
                sentence = self.buffer[:end_index].strip()

                if sentence:
                    complete_sentences.append(sentence)

                # 更新缓冲区，移除已发送的部分
                self.buffer = self.buffer[end_index:]
            else:
                # 没有找到句尾标点，跳出循环
                break

        # 3. 容错机制：如果缓冲区过长（长时间未找到标点），则强制发送
        if len(self.buffer) > self.max_buffer_length:
            # 强制将现有内容视为一个句子发送
            sentence = self.buffer.strip()
            if sentence:
                complete_sentences.append(sentence)
            # 清空缓冲区
            self.buffer = ""

        return complete_sentences

    def flush(self) -> str:
        """
        在流式输出结束后，清空缓冲区中剩余的所有文本。
        """
        if self.buffer:
            remaining_text = self.buffer.strip()
            self.buffer = ""
            return remaining_text
        return ""
